简书链接:原创刨根问底掌握布局样式主题追踪edittext背景默认样式修改下划线分析距离左边有一点距离的原因
文章字数:628,阅读全文大约需要2分钟
首先从EditText源码中发现R.attr.editTextStyle
首先要说明的是style分别是materialdesign库和来系统架构目录两种,都可以定位。

1
2
3
4
public EditText(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.editTextStyle);
}

然后定位values文件夹
image.png

image.png

分析editTextStyle
得到如下

1
<item name="editTextStyle">@style/Widget.Material.EditText</item>

然后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<style name="Widget.EditText">
<item name="focusable">true</item>
<item name="focusableInTouchMode">true</item>
<item name="clickable">true</item>
<item name="background">?attr/editTextBackground</item>
<item name="textAppearance">?attr/textAppearanceMediumInverse</item>
<item name="textColor">?attr/editTextColor</item>
<item name="gravity">center_vertical</item>
<item name="breakStrategy">simple</item>
<item name="hyphenationFrequency">@dimen/config_preferredHyphenationFrequency</item>
<item name="defaultFocusHighlightEnabled">false</item>
</style>


定位到editTextBackground
经过源码分析,发现

1
<item name="editTextBackground">@drawable/abc_edit_text_material</item>

image.png

1
2
3
4
5
6
7
8
9
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/textfield_default" />
<item android:state_window_focused="false" android:state_enabled="false" android:drawable="@drawable/textfield_disabled" />
<item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/textfield_selected" />
<item android:state_enabled="true" android:drawable="@drawable/textfield_default" />
<item android:state_focused="true" android:drawable="@drawable/textfield_disabled_selected" />
<item android:drawable="@drawable/textfield_disabled" />
</selector>

定位appcompat 样式大致是一样的
image.png

最后得到的是这个

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">

<selector>
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>

</inset>

所以大概是insertLeft搞的鬼,由于我这里是针对我的editspinner 无法和默认的保持一致,因此不能采用全局定义修改的方式进行,所以我直接拷贝复制以上

然后单独设置为背景即可。
image.png

设置前是这样的
image.png

设置后

image.png

最后我就解决了editspinner无法和edittext的背景边界对齐的问题了。
image.png